package com.komeri.komeriapl;

import static com.komeri.komeriapl.Constants.*;

import java.io.IOException;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.DialogInterface.OnCancelListener;
import android.net.Uri;
import android.os.AsyncTask;
import android.util.Log;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.gcm.GoogleCloudMessaging;

/**
 * プッシュ通知用 GCM(Google Cloud Messaging)登録クラス
 */
public class GcmRegister {
	
	/** Log出力用のタグ */
	private static final String TAG = GcmRegister.class.getSimpleName();
	
    /**
     * アプリケーションがプッシュ通知を許可されていることを示す識別子
     * Google Developers Console で発行する
     */
	private static final String SENDER_ID = "260022741698";
	
 	/** GCM登録用クラス */
	private GoogleCloudMessaging gcm;
	
    /** 呼び出し元のアクティビティ */
	private Activity activity;
	
    /**
     * プッシュ通知対応のアプリケーションに割り振られる識別子
     * GCMにより発行される
     */
	private String regId;
	
	/** 非同期サーバー通信用AsyncTask */
	private AsyncTask<Void, Void, String> registerTask;
	
	/**
	 * コンストラクタ
	 * @param activity 呼び出し元のアクティビティ
	 */
	public GcmRegister(Activity activity) {
		this.activity = activity;
	}
	
	/**
	 * 端末のGooglePlay開発者サービスアプリの確認
	 * @return GooglePlay開発者サービスが有効か否か
	 */
	public boolean checkPlayServices() {
		boolean bRet = true;
		
		//　GooglePlay開発者サービスが有効か確認する
	    int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(activity);
	    if (resultCode != ConnectionResult.SUCCESS) {
	    	if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
		    	// ユーザーにより復旧可能なエラーの場合は、アラートを表示し対応を促す
	            Dialog dialog = GooglePlayServicesUtil.getErrorDialog(resultCode, activity, PLAY_SERVICES_RESOLUTION_REQUEST, cancelListner);
	            dialog.show();
	    	} else {
	    		// GooglePlay開発者サービスがサポートされていない端末の場合
	    		// アラートを表示するが、アプリとしてはプッシュ通知配信なしで動作可能
				CommonUtility.showAlert(activity, R.string.googlePlayServices_not_support_alert, R.string.ok, 0, null, null);
	        }
	    	
	        bRet = false;
	    }
	    
	    return bRet;
	}
	
	/**
	 * GooglePlay開発者サービスエラーダイアログ　キャンセル時のリスナー
	 */
    private OnCancelListener cancelListner = new DialogInterface.OnCancelListener() {
    	public void onCancel (DialogInterface dialog) {
    		// アラートを表示するが、アプリとしてはプッシュ通知配信なしで動作可能
			CommonUtility.showAlert(activity, R.string.googlePlayServices_disable_alert, R.string.ok, 0, null, null);
    	}
    };
    
	/**
	 * GCM登録実行
	 */
	public void executeRegistration() {
		
        registerTask = new AsyncTask<Void, Void, String>() {
        	
        	/**
        	 * 非同期処理を記述する
        	 */
            @Override
            protected String doInBackground(Void... params) {
            	StringBuilder appNewVer = new StringBuilder("");
            	
            	try {
            		Log.d(TAG, "start register AsyncTask.");
            		
                	Context appContext = MyApplication.getAppContext();
                    if (gcm == null) {
                        gcm = GoogleCloudMessaging.getInstance(appContext);
                    }
                    
                    // GCMサーバーに登録し、レジストレーションIDを取得
                    regId = gcm.register(SENDER_ID);
                	Log.i(TAG, "Registration ID: " + regId);
                	
                    //　アプリケーションサーバーにレジストレーションIDを送信する
                	ServerUtilities.register(regId, appNewVer);
                	
            	} catch (IOException ex) {
            		Log.e(TAG, "register AsyncTask failed. - " + ex);
                } finally {
            	    if (gcm != null) {
            		    gcm.close();	    	
            	    }
                }
            	
                return appNewVer.toString();
            }
            
            /**
             * 非同期処理が完了すると呼ばれる
             */
            @Override
            protected void onPostExecute(String result) {
        		Log.d(TAG, "finish register AsyncTask.");
    	    	
        		// 実行している現在のバージョンとサーバーから取得した最新バージョンを比較し、現在のバージョンが小さい場合、
        		// アップデートを通知するためのダイアログを表示する
        	    if ((result != null) && (result.compareTo(CommonUtility.appVersion()) > 0)) {
        			OnClickListener listener = new DialogInterface.OnClickListener() {
          		    	
        				/**
        				 * ボタンをクリックされたら呼ばれる
        				 */
        				@Override
        		    	public void onClick(DialogInterface dialog, int which) {
                			Uri uri = Uri.parse("market://details?id=com.komeri.komeriapl");
                			Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                			activity.startActivity(intent);
        		    	}
        		    };
        		    
        	    	CommonUtility.showAlert(activity, R.string.app_update_alert, R.string.update, 0, listener, null);
        	    }
        		
                registerTask = null;
            }
        };
        
        // 非同期処理の実行
        registerTask.execute();        
    }
	
	/**
	 * GCM登録解除実行(テスト用) 
	 * 新規に登録を行う際、以前の登録の解除に使用する
	 */
	public void executeUnregistration() {
		
        registerTask = new AsyncTask<Void, Void, String>() {
        	
        	/**
        	 * 非同期処理を記述する
        	 */
            @Override
            protected String doInBackground(Void... params) {
            	try {
            		Log.d(TAG, "start unregister AsyncTask.");
            		
                	Context appContext = MyApplication.getAppContext();
                    if (gcm == null) {
                        gcm = GoogleCloudMessaging.getInstance(appContext);
                    }
                    
                    // GCMサーバーから登録を解除する
        			gcm.unregister();
                    
            	} catch (IOException ex) {
            		Log.e(TAG, "unregister AsyncTask failed. - " + ex);
                } finally {
            	    if (gcm != null) {
            		    gcm.close();	    	
            	    }
                }
            	
                return null;
            }
            
            /**
             * 非同期処理が完了すると呼ばれる
             */
            @Override
            protected void onPostExecute(String result) {
        		Log.d(TAG, "finish unregister AsyncTask.");
                registerTask = null;
            }
        };
        
        // 非同期処理の実行
        registerTask.execute();        
    }
}
